//------------------游戏控制--------------------//
// 游戏时钟(定时器)
var gameTimer;
// 生成子弹(定时器)
var createBulletTimer;
// 生成敌人(定时器)
var createEnemyTimer;
//---------------------------------------------//

//------------------游戏配置--------------------//
// 每秒生成的数量
var createBulletSpeed = 10;
// 子弹发射速度
var bulletMoveSpeed = 10;
// 每秒生成的数量
var createEnemySpeed = 5;
// 敌人移动速度
var enemyMoveSpeed = 5;
//---------------------------------------------//

//------------------游戏资源--------------------//
// 子弹数组
var bulletArr = [];
// 子弹对象池
var bulletPoolArr = [];
// 敌人数组
var enemyArr = [];
// 敌人对象池
var enemyPoolArr = [];
//---------------------------------------------//
$(function () {
    // 初始化飞机位置
    $(myPlaneDom).css({
        left: $(window).width() / 2 - $(myPlaneDom).width() / 2 + 'px',
        top: $(window).height() - $(myPlaneDom).height() - 100 + 'px'
    })
    // 自动开始游戏
    // startBtn.click();

    // 开始游戏
    $(startBtn).click(function () {
        // 隐藏菜单
        panelDom.classList.add('hide');
        // 玩家移动
        planeMove()
        // 生成子弹
        createBulletTimer = setInterval(createBullet, 1000 / createBulletSpeed);
        createEnemyTimer = setInterval(createEnemy, 1000 / createEnemySpeed);
        // 发射子弹
        gameTimer = setInterval(function () {
            // 子弹移动
            bulletMove();
            // 敌人移动
            enemyMove();
            checkDomCollision();
        }, 15)
    })
})

// 玩家移动实现
function planeMove() {
    // 触摸屏幕(移动端)
    document.ontouchstart = function (e) {
        // 触摸开始时的坐标
        var startX = e.touches[0].clientX;
        var startY = e.touches[0].clientY;
        // 飞机开始时的坐标  
        var planeStartX = parseInt(myPlaneDom.style.left);
        var planeStartY = parseInt(myPlaneDom.style.top);
        document.ontouchmove = function (e) {
            var moveX = e.touches[0].clientX;
            var moveY = e.touches[0].clientY;

            myPlaneDom.style.left = planeStartX + moveX - startX + 'px';
            myPlaneDom.style.top = planeStartY + moveY - startY + 'px';
        }
    }

    document.ontouchend = function () {
        document.ontouchmove = null;
    }

    // 鼠标按下(PC端)
    document.onmousedown = function (e1) {
        // 鼠标按下瞬间的坐标
        var oldX = e1.clientX;
        var oldY = e1.clientY;
        // 鼠标按下瞬间，飞机的旧坐标
        var oldPlaneX = parseInt(myPlaneDom.style.left);
        var oldPlaneY = parseInt(myPlaneDom.style.top);
        document.onmousemove = function (e2) {
            var newX = e2.clientX;
            var newY = e2.clientY;
            myPlaneDom.style.left = oldPlaneX + newX - oldX + 'px';
            myPlaneDom.style.top = oldPlaneY + newY - oldY + 'px';
        }
    }
    // 鼠标抬起
    document.onmouseup = function () {
        document.onmousemove = null;
    }
}
// 生成子弹实现
function createBullet() {
    // 如果对象池有数据，就从对象池取
    var bullet = null;
    if (bulletPoolArr.length) {
        bullet = bulletPoolArr.pop();
    } else {
        bullet = document.createElement('img');
        bullet.src = './img/bullet.png';
        bullet.classList.add('pf');
    }


    // 初始化子弹位置
    bullet.style.left = myPlaneDom.offsetLeft + myPlaneDom.offsetWidth / 2 - 3 + 'px';
    bullet.style.top = myPlaneDom.offsetTop + myPlaneDom.offsetHeight / 2 - 7 + 'px';
    // 显示子弹
    ballDom.appendChild(bullet);
    bulletArr.push(bullet);
}
// 子弹移动实现
function bulletMove() {
    // 循环所有子弹，移动位置
    for (var i = 0; i < bulletArr.length; i++) {
        var bullet = bulletArr[i];
        // 目标位置
        var goalY = bullet.offsetTop - bulletMoveSpeed;
        // 超出屏幕移除
        if (goalY + 16 <= 0) {
            // 销毁子弹
            ballDom.removeChild(bullet);
            // 加入对象池
            bulletPoolArr.push(bullet);
            // 从子弹数组删除
            bulletArr.splice(i, 1);
            i--;
        } else {
            bullet.style.top = goalY + 'px';
        }

    }
}
// 生成敌人实现
function createEnemy() {
    // 如果对象池有数据，就从对象池取
    var enemy = null;
    if (enemyPoolArr.length) {
        enemy = enemyPoolArr.pop();
    } else {
        enemy = document.createElement('img');
        enemy.src = './img/enemy1.png';
        enemy.classList.add('pf');
    }

    // 初始化子弹位置
    enemy.style.left = Math.random() * (document.documentElement.clientWidth - 50) + 'px';
    // enemy.style.left = myPlaneDom.offsetLeft + myPlaneDom.offsetWidth / 2 - 3 + 'px';
    enemy.style.top = - enemy.offsetHeight + 'px';
    // 显示子弹
    enemyDom.appendChild(enemy);
    enemyArr.push(enemy);
}
// 敌人移动实现
function enemyMove() {
    for (var i = 0; i < enemyArr.length; i++) {
        var enemy = enemyArr[i];
        // 回收敌人
        var goalY = enemy.offsetTop + enemyMoveSpeed;
        if (goalY >= document.documentElement.clientHeight) {
            // 销毁敌人
            enemyDom.removeChild(enemy);
            // 加入对象池
            enemyPoolArr.push(enemy);
            // 数组中删除
            enemyArr.splice(i, 1);
            i--;
        } else {
            // 不离开屏幕，更新位置
            enemy.style.top = goalY + 'px';
        }
    }
}
// 移动对象封装
function moveObjects(objects, container, speed) {
    for (let i = 0; i < objects.length; i++) {
        let object = objects[i];
        let goal = object.offsetTop + speed;
        if (speed < 0 ? goal + 16 <= 0 : goal >= document.documentElement.clientHeight) {
            // 移出屏幕
            container.removeChild(object);
            objectPool.push(object);
            objects.splice(i, 1);
            i--;
        } else {
            // 更新位置    
            object.style.top = goal + 'px';
        }
    }
}


// 碰撞检测实现
function isCollision(dom1, dom2) {
    // 没碰着的情况
    if (
        dom1.offsetLeft + dom1.offsetWidth < dom2.offsetLeft ||
        dom1.offsetLeft > dom2.offsetLeft + dom2.offsetWidth ||
        dom1.offsetTop + dom1.offsetHeight < dom2.offsetTop ||
        dom1.offsetTop > dom2.offsetTop + dom2.offsetHeight
    ) {
        return false;
    }
    return true;
}
// 游戏碰撞实现
function checkDomCollision() {
    for (var i = 0; i < enemyArr.length; i++) {
        var enemy = enemyArr[i];;
        for (var j = 0; j < bulletArr.length; j++) {
            var bullet = bulletArr[j];
            if (isCollision(enemy, bullet)) {
                // 碰撞成功
                // 移除子弹
                bulletArr.splice(j, 1);
                ballDom.removeChild(bullet);
                bulletPoolArr.push(bullet);
                // 移除敌机
                enemyArr.splice(i, 1);
                i--;
                enemyDom.removeChild(enemy);
                enemyPoolArr.push(enemy);
            }
        }
    }
}
